#ifndef USERMODEL_H
#define USERMODEL_H
#include "user.h"
#include <QList>
#include "queryresultmodel.h"
#include <QStyledItemDelegate>
#include <QPainter>
#include <QFontMetrics>
#include <QStyleOptionViewItem>
#include <QModelIndex>
#include <QVariant>
const int UserModelRole = Qt::UserRole + 7;
class UserItemDelegate : public QStyledItemDelegate {
    Q_OBJECT
public:
    explicit UserItemDelegate(QObject *parent = nullptr)
        : QStyledItemDelegate(parent) {}

    // 绘制列表项（核心函数）
    void paint(QPainter *painter, const QStyleOptionViewItem &option,
               const QModelIndex &index) const override {
        painter->save(); // 保存画笔状态，避免影响其他绘制

        // 1. 绘制默认背景（选中/hover 状态）
        QStyle *style = option.widget ? option.widget->style() : QApplication::style();
        style->drawControl(QStyle::CE_ItemViewItem, &option, painter, option.widget);

        // 2. 获取 Model 中的 User 数据（支持 User 对象或 User* 指针）
        QVariant data = index.data(Qt::UserRole+7);
        User user;
        bool isValidUser = false;

        if (data.canConvert<User>()) {
            user = data.value<User>();
            isValidUser = true;
        } else if (data.canConvert<User*>()) {
            User *userPtr = data.value<User*>();
            if (userPtr) {
                user = *userPtr;
                isValidUser = true;
            }
        }

        // 3. 无效用户数据处理
        if (!isValidUser) {
            drawText(painter,option, option.rect.adjusted(10, 10, -10, -10),
                     Qt::AlignCenter, "未知用户", QColor(150, 150, 150));
            painter->restore();
            return;
        }

        // 4. 定义要显示的字段（排除密码 pass，隐私字段不展示）
        QList<QPair<QString, QString>> displayFields;
        displayFields << qMakePair(QString("姓名"), getNonEmptyValue(user.name))
                      << qMakePair(QString("ID"), getNonEmptyValue(user.id))
                      << qMakePair(QString("用户类型"), getRoleDisplayValue(user.type))
                      << qMakePair(QString("头像路径"), getNonEmptyValue(user.avatar))
                      << qMakePair(QString("邮箱"), getNonEmptyValue(user.email))
                      << qMakePair(QString("身份证号"), getNonEmptyValue(user.idcard_num))
                      << qMakePair(QString("注册日期"), getDateDisplayValue(user.join_at))
                      << qMakePair(QString("年龄"), getAgeDisplayValue(user.age))
                      << qMakePair(QString("手机号"), getNonEmptyValue(user.tel));

        // 5. 计算绘制参数（每行高度、边距）
        int margin = 8; // 内边距
        int lineHeight = option.fontMetrics.height() + 4; // 每行高度（字体高度+间距）
        QRect contentRect = option.rect.adjusted(margin, margin, -margin, -margin); // 内容绘制区域

        // 6. 逐行绘制字段（字段名灰色，字段值黑色）
        for (int i = 0; i < displayFields.size(); ++i) {
            QRect lineRect = contentRect.translated(0, i * lineHeight);
            lineRect.setHeight(lineHeight);

            // 绘制字段名（右对齐，灰色）
            QString fieldName = displayFields[i].first + "：";
            int nameWidth = option.fontMetrics.horizontalAdvance(fieldName) + 10;
            QRect nameRect = lineRect.adjusted(0, 0, -lineRect.width() + nameWidth, 0);
            drawText(painter, option,nameRect,Qt::AlignRight, fieldName, QColor(100, 100, 100));

            // 绘制字段值（左对齐，黑色）
            QString fieldValue = displayFields[i].second;
            QRect valueRect = lineRect.adjusted(nameWidth, 0, 0, 0);
            drawText(painter, option,valueRect, Qt::AlignLeft, fieldValue, QColor(30, 30, 30));
        }

        painter->restore(); // 恢复画笔状态
    }

    // 计算列表项大小（确保能容纳所有字段）
    QSize sizeHint(const QStyleOptionViewItem &option,
                   const QModelIndex &index) const override {
        int margin = 16; // 上下总边距
        int lineCount = 9; // 显示的字段行数（与 paint 中一致）
        int lineHeight = option.fontMetrics.height() + 4; // 每行高度
        int totalHeight = lineCount * lineHeight + margin;
        int width = option.rect.width(); // 宽度跟随列表视图
        return QSize(width, totalHeight);
    }

private:
    // 辅助函数：字符串字段为空时返回"未知"
    QString getNonEmptyValue(const QString &value) const {
        return value.trimmed().isEmpty() ? "未知" : value.trimmed();
    }

    // 辅助函数：角色类型字段显示（Unknown 转为"未知"）
    QString getRoleDisplayValue(Role role) const {
        QString roleStr = User::RoleToString(role);
        return roleStr == "Unknown" ? "未知" : roleStr;
    }

    // 辅助函数：日期字段显示（无效日期返回"未知"）
    QString getDateDisplayValue(const QDate &date) const {
        return date.isValid() ? date.toString("yyyy-MM-dd") : "未知";
    }

    // 辅助函数：年龄字段显示（<=0 视为未知）
    QString getAgeDisplayValue(int age) const {
        return (age > 0 && age <= 150) ? QString::number(age) : "未知";
    }

    // 辅助函数：绘制文本（处理溢出省略）
    void drawText(QPainter *painter,const QStyleOptionViewItem& option, const QRect &rect, Qt::Alignment alignment,
                  const QString &text, const QColor &color) const {
        painter->setPen(color);
        QString elidedText = option.fontMetrics.elidedText(
            text, Qt::ElideRight, rect.width() - 4); // 超出宽度时省略
        painter->drawText(rect, alignment, elidedText);
    }
};
class UserModel : public QAbstractListModel {
    Q_OBJECT
public:
    // 保留原有成员（CurrentUser、token、users）
    User CurrentUser;
    QString token;
    QList<User> users;

    // 构造函数（可初始化数据）
    explicit UserModel(QObject *parent = nullptr)
        : QAbstractListModel(parent) {}

    // 1. 重写：返回数据总行数（users 的大小）
    int rowCount(const QModelIndex &parent = QModelIndex()) const override {
        // 列表模型无父子关系，parent 始终是无效索引
        Q_UNUSED(parent);
        return users.size();
    }

    // 2. 重写：返回指定索引+角色的数据（核心接口，适配 Delegate）
    QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override {
        // 校验索引有效性（行超出范围、列非0（列表模型仅1列）均返回无效）
        if (!index.isValid() || index.column() != 0 || index.row() >= users.size()) {
            return QVariant();
        }

        // 获取当前行的 User 数据
        const User &user = (users.at(index.row()));

        // 关键：Delegate 通过 Qt::UserRole 获取 User 数据
        if (role == Qt::UserRole+7) {
            return QVariant::fromValue(user); // 包装 User 对象为 QVariant（需 Q_DECLARE_METATYPE(User)）
        }

        // 其他角色（如 Qt::DisplayRole 可返回默认文本，可选）
        if (role == Qt::DisplayRole) {
            return user.getName().trimmed().isEmpty() ? "未知用户" : user.getName();
        }

        return QVariant();
    }

    // 3. 可选重写：返回支持的角色（明确告知视图/Delegate 支持 Qt::UserRole）

    // ---------------------- 新增：数据操作接口（可选，方便增删改数据）----------------------
    // 添加单个用户（自动通知视图刷新）
    void addUser(const User &user) {
        beginInsertRows(QModelIndex(), users.size(), users.size()); // 通知视图：即将插入一行（行号=当前大小）
        users.append(user);
        endInsertRows(); // 通知视图：插入完成，刷新界面
    }

    // 批量添加用户
    void addUsers(const QList<User> &userList) {
        if (userList.isEmpty()) return;
        beginInsertRows(QModelIndex(), users.size(), users.size() + userList.size() - 1);
        users.append(userList);
        endInsertRows();
    }

    // 删除指定行的用户
    void removeUser(int row) {
        if (row < 0 || row >= users.size()) return;
        beginRemoveRows(QModelIndex(), row, row); // 通知视图：即将删除一行
        users.removeAt(row);
        endRemoveRows(); // 通知视图：删除完成
    }

    // 清空所有用户
    void clearUsers() {
        beginResetModel(); // 通知视图：模型数据即将全量重置
        users.clear();
        endResetModel(); // 通知视图：重置完成
    }

    // 更新指定行的用户数据
    void updateUser(int row, const User &newUser) {
        if (row < 0 || row >= users.size()) return;
        users[row] = newUser;
        // 通知视图：指定行数据变化，刷新该行
        emit dataChanged(index(row, 0), index(row, 0), {UserModelRole, Qt::DisplayRole});
    }
};

#endif // USERMODEL_H
